/**
 * 题目二:
 * 基于以下代码完成下面的四个练习
 */

const fp = require('lodash/fp');
const cars = [
  { name: 'Ferrari FF', horsepower: 660, dollar_value: 700000, in_stock: true },
  {
    name: 'Spyker C12 Zagato',
    horsepower: 650,
    dollar_value: 648000,
    in_stock: false,
  },
  {
    name: 'Jaguar XKR-S',
    horsepower: 550,
    dollar_value: 132000,
    in_stock: false,
  },
  { name: 'Audi R8', horsepower: 525, dollar_value: 114200, in_stock: false },
  {
    name: 'Aston Martin One-77',
    horsepower: 750,
    dollar_value: 1850000,
    in_stock: true,
  },
  {
    name: 'Pagani Huayra',
    horsepower: 700,
    dollar_value: 1300000,
    in_stock: false,
  },
];

/**
 * 练习1:
 * 使用函数组合 fp.flowRight() 重新实现下面这个函数
 *  let isLastInStock = function (cars) {
      // 获取最后一条数据
      let last_car = fp.last(cars);
      // 获取最后一条数据的 in_stock 属性值
      return fp.prop('in_stock', last_car)
    }
 */

console.info('练习1: 获取最后一条数据的 in_stock 值.');
const isLastInStock = fp.flowRight(fp.prop('in_stock'), fp.last);
const inStock = isLastInStock(cars);
console.info(inStock);

/**
 * 练习2:
 * 使用 fp.flowRight(), fp.prop() 和 pf.first() 获取第一个 car 的 name
 */

console.info('练习2: 获取第一个 car 的 name');
const getFirstCarName = fp.flowRight(fp.prop('name'), fp.first);
const name = getFirstCarName(cars);
console.info(name);

/**
 * 练习3:
 * 使用帮助函数 _average 重构 averageDollarValue, 使用函数组合的方式
 * let _average = function(xs) { return fp.reduce(fp.add, 0, xs) / xs.length; }
 * let averageDollarValue = function(cars) {
 *  let doller_values = fp.map(function(car) {
 *    return car.doller_value;
 *  }, cars);
 *  return _average(doller_values);
 * }
 */

let _average = function (xs) {
  return fp.reduce(fp.add, 0, xs) / xs.length;
};
const averageDollerValue = fp.compose(
  _average,
  fp.map((car) => car.dollar_value)
);
console.info('练习3: 使用函数组合的方式重构 averageDollerValue ');
console.info(averageDollerValue(cars));

/**
 * 练习4:
 * 使用 flowRight 写一个 sanitizeNames() 函数,
 * 返回一个下划线链接的小写字符串,
 * 把数组中的 name 装换为这种形式:
 * 例如:
 * sanitizeNames(["Hello World"]) => ["hello_world"]
 */

let _underscore = fp.replace(/\W+/g, '_');
const sanitizeNames = fp.map(fp.flowRight(_underscore, fp.toLower));
console.info('练习4: 将数组中的字符串转换为小写');
console.info(sanitizeNames(fp.map(fp.prop('name'), cars)));
